# 给你一个字符串表达式 s ，请你实现一个基本计算器来计算并返回它的值。 
# 
#  整数除法仅保留整数部分。 
# 
#  你可以假设给定的表达式总是有效的。所有中间结果将在 [-2³¹, 2³¹ - 1] 的范围内。 
# 
#  注意：不允许使用任何将字符串作为数学表达式计算的内置函数，比如 eval() 。 
# 
#  
# 
#  示例 1： 
# 
#  
# 输入：s = "3+2*2"
# 输出：7
#  
# 
#  示例 2： 
# 
#  
# 输入：s = " 3/2 "
# 输出：1
#  
# 
#  示例 3： 
# 
#  
# 输入：s = " 3+5 / 2 "
# 输出：5
#  
# 
#  
# 
#  提示： 
# 
#  
#  1 <= s.length <= 3 * 10⁵ 
#  s 由整数和算符 ('+', '-', '*', '/') 组成，中间由一些空格隔开 
#  s 表示一个 有效表达式 
#  表达式中的所有整数都是非负整数，且在范围 [0, 2³¹ - 1] 内 
#  题目数据保证答案是一个 32-bit 整数 
#  
# 
#  Related Topics 栈 数学 字符串 👍 820 👎 0
from operator import add, sub, mul


# leetcode submit region begin(Prohibit modification and deletion)
class Solution:
    # def calculate(self, s: str) -> int:
    #     numStcak = []
    #     # 存符号
    #     Persymbol = '+'
    #     d = {
    #         "+": add,
    #         "-": sub,
    #         "*": mul,
    #         "/": lambda x, y: int(x / y),
    #     }
    #     n, i = len(s), 0
    #
    #     # 找出整数
    #     def ifordigit(i):
    #         num = 0
    #         while i < n and s[i].isdigit():
    #             num = num * 10 + int(s[i])
    #             i += 1
    #         return num, i - 1
    #
    #     while i < n:
    #         c = s[i]
    #         if c.isdigit():
    #             num, i = ifordigit(i)
    #             # 如果有乘除就立刻处理
    #             if Persymbol == "*" or Persymbol == "/":
    #                 numStcak.append(d[Persymbol](numStcak.pop(), num))
    #
    #             elif Persymbol == "+":
    #                 numStcak.append(num)
    #             elif Persymbol == "-":
    #                 numStcak.append(-num)
    #         elif c in d:
    #             Persymbol = c
    #         i += 1
    #
    #     return sum(numStcak)
    def calculate(self, s: str) -> int:
        n = len(s)
        stack = []
        preSign = '+'
        num = 0
        for i in range(n):
            if s[i] != ' ' and s[i].isdigit():
                num = num * 10 + ord(s[i]) - ord('0')
            if i == n - 1 or s[i] in '+-*/':
                if preSign == '+':
                    stack.append(num)
                elif preSign == '-':
                    stack.append(-num)
                elif preSign == '*':
                    stack.append(stack.pop() * num)
                else:
                    stack.append(int(stack.pop() / num))
                preSign = s[i]
                num = 0
        return sum(stack)



# leetcode submit region end(Prohibit modification and deletion)
print(Solution().calculate(s="10000-1*10-100*1000"))
